16. 最接近的三数之和
16. 最接近的三数之和
Similar Question
leading to the advanced question
Solution Tips
方案一: 排序 + 对撞指针
var threeSumClosest = function (nums, target) {
let res = Number.MAX_SAFE_INTEGER;
const len = nums.length;
nums.sort((a, b) => a - b);
// 因为输入只有一个解, 所以按理来说是不存在重复的数的, 但是跳过重复的逻辑保留也无法大碍
for (let i = 0; i < len - 2; i++) {
// 需要和上一次枚举的数不相同
if (nums[i] == nums[i - 1]) {
continue;
}
// 双指针
let left = i + 1;
let right = len - 1;
// 指针对撞式结束循环
while (left < right) {
let sum = nums[i] + nums[left] + nums[right];
// 直接相等了, 直接退出就好
if (sum === target) return sum;
if (Math.abs(target - sum) < Math.abs(target - res)) {
res = sum
}
if (sum < target) {
// left太小了,left指针右移
// 取等于,因为符合条件之后也需要移动指针
while (left < right && nums[left] === nums[++left]); // 如果相等就跳过
}
if (sum > target) {
// right太大了,right指针左移
while (left < right && nums[right] === nums[--right]); // 如果相等就跳过
}
}
}
return res;
};
let nums = [0, 1, 2], target = 3
console.log(threeSumClosest(nums, target));